/*
 * DespachoAPI.cpp
 *
 */

#include "DespachoAPI.h"
#include "../logger/logger.h"

namespace application {

DespachoAPI::DespachoAPI(std::string hostName, int clientId):
		m_CommunicationDespacho(hostName),
		m_CommunicationVendedor(hostName)
{
	middleware::CommunicationDespacho::launchForClient(hostName,clientId);
}

DespachoAPI::~DespachoAPI()
{

}

void DespachoAPI::retirarPedido(OrdenCompra ordenCompra,
					 ProductoCantidad productosRetirar,
					 ProductoList &productosRetirados)
{
	int i;
	Producto producto;
	ProductoCantidad datosProductoRoto;
	int cantidadRetirada=0;

	datosProductoRoto.cantidad=0;
	datosProductoRoto.tipo=productosRetirar.tipo;

	m_CommunicationDespacho.esperarNotificacion(ordenCompra.header.clientId);

	CLogger::log("Se recibio una notificacion desde despacho", LogLevelEnum::TRACE);

	for(i=0; i <productosRetirar.cantidad; i++)
	{
		//TODO handlear si viene un producto roto
		m_CommunicationDespacho.retirarProducto(ordenCompra.header,
												productosRetirar.tipo,
												producto);

		if(producto.estado == PRODUCTO_ROTO)
		{
			datosProductoRoto.cantidad++;
			CLogger::log("Se rompio un producto durante el despacho", LogLevelEnum::TRACE);

		}

		if(producto.estado == PRODUCTO_TERMINADO)
		{
			productosRetirados.push_back(producto);
		}
	}

	if(datosProductoRoto.cantidad>0)
	{
		OrdenCompra ordenCompra;
		ordenCompra.productos.push_back(datosProductoRoto);
		m_CommunicationVendedor.sendOrdenCompra(ordenCompra);
	}
}

} /* namespace application */
